import type { ConversationResp } from './agent/model/conversation';

import { useWebSocket } from '@vueuse/core';

import { base64decode } from '#/utils/base64decode';

import { conversationHandle } from './agent/actions/conversation';
import { pingHandle } from './agent/actions/ping';

// const isFirstConnection = ref(true); // 标志位，标记是否是第一次连接

type MessageType = 'conversation' | 'error' | 'pong';

// Websocket工具封装
export const UseWebSocket = (url: string) => {
  const { data, send, open, close, ws } = useWebSocket(url, {
    // websocket初次链接
    onConnected(ws: WebSocket) {
      // 连接成功后，发送初始化连接消息
      // eslint-disable-next-line no-console
      console.info(`连接成功！~${ws.url}`);
      // if (isFirstConnection.value) {
      //   // 第一次连接
      //   ws.send(JSON.stringify({ type: 'ping' }));
      //   isFirstConnection.value = false; // 第一次连接完成后，将标志位设为 false
      // } else {
      //   // 如果不是第一次连接，则发送重连消息
      //   // ws.send(JSON.stringify({ type: 'reconnect', data: 'your_data' }));
      // }
    },

    // 消息处理
    onMessage: (ws: WebSocket, event: MessageEvent) => {
      // 1. 解析JSON
      const data: ConversationResp = JSON.parse(event.data);
      // 错误提示处理！
      if (data.code > 0) {
        ElMessage.error(data.msg);
        return;
      }
      // 2. 解码
      const decoded = base64decode(data.data as string);
      // 3. 重新赋值
      data.data = decoded as any;

      // 正常业务逻辑处理！
      switch (data.type as MessageType) {
        // 会话处理
        case 'conversation': {
          conversationHandle(data, ws);
          break;
        }

        // 心跳处理
        case 'pong': {
          pingHandle(data, ws);
          break;
        }
        default: {
          break;
        }
      }
    },

    // 心跳配置
    heartbeat: {
      message: '{ "type":"ping"}', // 心跳消息
      responseMessage: '{"type":"pong"}', // 预期响应
      interval: 10_000, // 心跳间隔(ms)
      pongTimeout: 3000, // 响应超时时间(ms)
    },

    // 自动重连配置
    autoReconnect: {
      retries: 50_000_000_000, // 最大重试次数
      delay: 5000, // 重试间隔(ms)
      onFailed: () => {
        // // 重试失败回调
        ElMessage.error('Websocket重连失败!');
      },
    },

    // 断开连接
    onDisconnected(ws: WebSocket) {
      ws.send(JSON.stringify({ type: 88_888 }));
    },

    // 错误处理
    onError: (ws: WebSocket, event: Event) => {
      ElMessage.error(event.toString());
      ws.send(JSON.stringify({ type: 'error', msg: event.toString() }));
    },
  });
  return {
    data,
    send,
    open,
    close,
    ws,
  };
};
